package dataediter;

import main.Resource;
import other.Tool;

import java.util.ArrayList;

/**
 * 表格读取写入
 *
 * @author fdh
 */
public class TableWR extends FileWRBase {
    private String filePath;

    public TableWR(String filePath) throws Exception {
        if (!filePath.contains("." + Resource.Tables.TablesMakers.suffixName)) {
            throw new Exception(filePath + ",表格文件读取失败,请检查后缀名");
        }
        this.filePath = filePath;
    }

    public TableWR() {
        filePath = Resource.Tables.tablesPath;
    }

    // region 设置当前要处理的文件

    /**
     * 设置需要处理的文件路径
     *
     * @param filePath
     */
    public void setFilePath(String filePath) throws Exception {
        if (!filePath.contains("." + Resource.Tables.TablesMakers.suffixName)) {
            throw new Exception(filePath + ",表格文件读取失败,请检查后缀名");
        }
        this.filePath = filePath;
    }

    /**
     * 设置默认路径下需要处理的文件名,不包含后缀名
     *
     * @param fileName
     */
    public void setFileName(String fileName) {
        this.filePath = Resource.Tables.tablesPath + fileName + "." + Resource.Tables.TablesMakers.suffixName;
    }

    /**
     * 设置默认路径下的文件,包含后缀名
     *
     * @param file
     */
    public void setFile(String file) throws Exception {
        if (!file.contains("." + Resource.Tables.TablesMakers.suffixName)) {
            throw new Exception(file + ",表格文件读取失败,请检查后缀名");
        }
        this.filePath = Resource.Tables.tablesPath + file;
    }
    // endregion

    // region 读取表格

    /**
     * 获取指定文件的表格数据
     *
     * @param data 数据
     */
    public void readFromTableFile(ArrayList<String[]> data) {
        ArrayList<String> colName = super.readAll(filePath, new ReadAll() {
            @Override
            public boolean start(String line) {
                return line.equals(Resource.Tables.TablesMakers.columnStart);
            }

            @Override
            public boolean end(String line) {
                return line.equals(Resource.Tables.TablesMakers.columnEnd);
            }
        });

        ArrayList<String> rowData = super.readAll(filePath, new ReadAll() {
            @Override
            public boolean start(String line) {
                return line.equals(Resource.Tables.TablesMakers.rowStart);
            }

            @Override
            public boolean end(String line) {
                return line.equals(Resource.Tables.TablesMakers.rowEnd);
            }
        });

        if (colName == null && rowData == null) {
            System.out.println("读取失败,请检查路径问题:" + filePath);
            return;
        }

        String[][] rows = toData(rowData);
        String[] col = toColumn(colName);

        if (rows == null && col == null) {
            System.out.println("读取失败,请检查table文件问题,可能文件为空:" + filePath);
            return;
        }
        data.add(col);
        if (rows == null) {
            System.out.println("数据读取失败,数据可能为空:" + filePath);
            return;
        }
        for (String[] s : rows) {
            data.add(s);
        }
    }
    //endregion

    // region 写入表格文件

    /**
     * 把数据写入表格文件
     *
     * @param datas 表格数据
     * @param col   列名
     */
    public void writeToTableFile(String[][] datas, String[] col) {
        ArrayList<String> list = new ArrayList<>();
        //数据空处理,不处理表格里都是null,太难看了           ps:现在来看当时困扰我的问题还挺有趣的
//        reduceData(datas);
//        reduceCol(col);
        list.add(Resource.Tables.TablesMakers.columnStart);
        list.add(String.join(Resource.Tables.TablesMakers.splitChar, col));
        list.add(Resource.Tables.TablesMakers.columnEnd);
        list.add("\n");
        list.add(Resource.Tables.TablesMakers.rowStart);
        for (String[] data : datas) {
            list.add(String.join(Resource.Tables.TablesMakers.splitChar, data));
        }
        list.add(Resource.Tables.TablesMakers.rowEnd);
        writeAllData(filePath, list);
    }

    //这些代码已经不需要了,因为数据已经预处理过了,bye bye了
//    //数据空处理
//    private void reduceData(String[][] datas) {
//        for (int i = 0; i < datas.length; i++) {
//            for (int j = 0; j < datas[0].length; j++) {
//                if (datas[i][j] == null || datas[i][j].equals("null")) {
//                    datas[i][j] = "";
//                }
//            }
//        }
//    }
//
//    private void reduceCol(String[] col) {
//        for (int i = 0; i < col.length; i++) {
//            if (col[i] == null || col[i].equals("null")) {
//                col[i] = "";
//            }
//        }
//    }
    // endregion

    // region 解析表格文件
    //这两个是对数据再处理的
    public static String[][] getDataFromArray(ArrayList<String[]> data) {
        try {
            String[][] datas = new String[Resource.Config.tableMaxRowCount][data.get(0).length];
            for (int i = 1; i < data.size(); i++) {
                datas[i - 1] = data.get(i);
            }
            return datas;
        } catch (Exception e) {
            System.out.println("Array转String[][]失败");
            return null;
        }
    }

    public static String[] getColFromArray(ArrayList<String[]> data) {
        try {
            return data.get(0);
        } catch (Exception e) {
            System.out.println("Array转String[]失败");
            return null;
        }
    }


    //下面两个是解析原始数据的

    private String[] toColumn(ArrayList<String> datas) {
        String lines;
        try {
            lines = datas.get(0);
        } catch (Exception e) {
            System.out.println("列名获取失败:" + filePath);
            return null;
        }
        return Tool.getInstance().mySplit(lines, Resource.Tables.TablesMakers.splitChar.charAt(0));
    }

    private String[][] toData(ArrayList<String> datas) {
        int col;
        try {
//            col = datas.get(0).split("\\" + Resource.Tables.TablesMakers.splitChar).length;
            col = Tool.getInstance().mySplit(datas.get(0), Resource.Tables.TablesMakers.splitChar.charAt(0)).length;
        } catch (Exception e) {
            System.out.println("数据获取失败:" + datas);
            return null;
        }
        String[][] tb = new String[Resource.Config.tableMaxRowCount][col];
        try {
            for (int i = 0; i < datas.size(); i++) {
//                tb[i] = datas.get(i).split("\\" + Resource.Tables.TablesMakers.splitChar);
                tb[i] = Tool.getInstance().mySplit(datas.get(i), Resource.Tables.TablesMakers.splitChar.charAt(0));
            }
        } catch (Exception e) {
            System.out.println("表格数据超出最大行:" + filePath + ",请修改配置类扩大行数");
        }
        return tb;
    }
    //endregion

    // region 寻找表格文件

    /**
     * 从默认路径下扫描并获取table文件名
     *
     * @param tableFileNames 存储table文件名
     */
    public static void searchTableFilesFromPath(ArrayList<String> tableFileNames) {
        FileWRBase.scanDirectory(Resource.Tables.tablesPath, Resource.Tables.TablesMakers.suffixName, tableFileNames);
        System.out.println("扫描的" + Resource.Tables.tablesPath + "下的所有表格文件:"
                + tableFileNames);
    }

    /**
     * 从指定路径下获取table文件名
     *
     * @param path           指定路径
     * @param tableFileNames 获取table文件名
     */
    public static void searchTableFilesFromPath(String path, ArrayList<String> tableFileNames) {
        FileWRBase.scanDirectory(path, Resource.Tables.TablesMakers.suffixName, tableFileNames);
    }
    //endregion

    // region 创建表格文件

    /**
     * 创建指定名字的表格文件
     *
     * @param fileName 文件名字
     */
    @Override
    public boolean createFile(String fileName) {
        return super.createFile(Resource.Tables.tablesPath + fileName.trim() + "." + Resource.Tables.TablesMakers.suffixName);
    }
    //endregion

    //region删除表格

    /**
     * 通过文件删除,包括后缀名
     *
     * @param file 路径
     * @return 是否成功删除
     */
    @Override
    public boolean delFile(String file) {
        return super.delFile(Resource.Tables.tablesPath + file);
    }

    /**
     * 通过文件名字删除,不包括后缀名
     *
     * @param fileName
     * @return 是否成功删除
     */
    public boolean delFileByName(String fileName) {
        return super.delFile(Resource.Tables.tablesPath + fileName + "." + Resource.Tables.TablesMakers.suffixName);
    }
    //endregion

}
